Don't support the old handling of zero height/width in gdk_window_clear_area
authorAlexander Larsson <alexl@redhat.com>
Fri, 11 Sep 2009 13:21:43 +0000 (15:21 +0200)
committerAlexander Larsson <alexl@redhat.com>
Fri, 11 Sep 2009 13:21:43 +0000 (15:21 +0200)
We used to handle zero height/width specially in the non-double buffered
case due to the weird behaviour of XClearArea in this case. However
this is undocumented, incompatible with what happens on double-buffered
drawing, and just not a good API. So, we drop this behaviour, having
fixed gtkclist.c which used this.

docs/reference/gtk/migrating-ClientSideWindows.sgml
gdk/gdkwindow.c

index b1721b292959e03e878d60eb82418c32d55da573..934c7b382df137e7282df04e095e4113529ac6c8 100644 (file)
     simply create a new cairo context for each expose event.
   </para>
 
+  <para>
+    Due to a weird API in XClearArea the gdk_window_clear_area() call handled
+    a specified width or height of zero to mean "to end of window" for
+    non-doublebuffered drawing. This has been changed to be consistent with
+    the docs and what happens in the doublebuffered case. All code in gtk+
+    that relied on this has been fixed, but it is possible (although unlikely)
+    that third party applications rely on this. If you need to do this, just
+    implement it yourself using gdk_drawable_get_size().
+  </para>
+
 </chapter>
index 760dd9554f6b3d7cd5dd8749490dc84e5233c59b..78911ae2341c4bf917c51c742f3caa6e00e30ee7 100644 (file)
@@ -4349,7 +4349,6 @@ gdk_window_clear_area_internal (GdkWindow *window,
                                gint       height,
                                gboolean   send_expose)
 {
-  GdkWindowObject *private = (GdkWindowObject *)window;
   GdkRectangle rect;
   GdkRegion *region;
 
@@ -4358,12 +4357,10 @@ gdk_window_clear_area_internal (GdkWindow *window,
   if (GDK_WINDOW_DESTROYED (window))
     return;
 
-  /* This is what XClearArea does, and e.g. GtkCList uses it,
-     so we need to duplicate that */
-  if (width == 0)
-    width = private->width - x;
-  if (height == 0)
-    height = private->height - y;
+  /* Terminate early to avoid weird interpretation of
+     zero width/height by XClearArea */
+  if (width == 0 || height == 0)
+    return;
 
   rect.x = x;
   rect.y = y;